% 原始论文公式 4-12，公狮个体迁移类似于单条染色体内进行交叉变异
% 函数说明：输入第k代最优个体，任选两个序列进行互换.元件序列格式和遗传算法一样分为组内和组间
% LSO_2opt_Mut函数返回的每个life个体已经计算好距离和适应值，因此以后不必再计算（比如雄狮排序选择最优个体），节约时间
% 参数说明：SMT对象、个体类（对象内的pc=gc，保证吸头和贴放每组的元件一样）、随机选择概率（类似于遗传算法的交叉概率）、喂料器一次互换的数量
% 可修改的参数：随机选择概率、组内组间交换的数量
function life = LSO_2opt_Mut(Smt,gk_life,rand_rate,FeCrossNum)
     %% 1.分组内互换、组间互换的情况
     parent_life = gk_life;
     if unifrnd (0,1) > rand_rate %大于随机选择概率则组内互换
        r = randperm(length(gk_life.pc(:,1)),1); %随机选一组
        rand = randperm(length(gk_life.pc(1,:)),2);%两个随机数
        %% 贴放序列组内互换
        temp = gk_life.pc(r,rand(1));
        if temp==0 || gk_life.pc(r,rand(2)) == 0
            %排除0
        else
            gk_life.pc(r,rand(1)) = gk_life.pc(r,rand(2));
            gk_life.pc(r,rand(2)) = temp;
        end
       %% 贴头/拾取序列组内互换
        r = randperm(length(gk_life.pc(:,1)),1); %随机选一组
        rand = randperm(length(gk_life.pc(1,:)),2);%两个随机数
        temp = gk_life.gc(r,rand(1));
        if temp==0 || gk_life.gc(r,rand(2)) == 0
            %排除0
        else
            gk_life.gc(r,rand(1)) = gk_life.gc(r,rand(2));
            gk_life.gc(r,rand(2)) = temp;
        end
        
     else %小于随机选择概率则组间互换
        %%  贴放序列组间互换
         r = randperm(length(gk_life.pc(:,1)),2); %随机选两组互换
         temp = gk_life.pc(r(1),:);
         gk_life.pc(r(1),:) = gk_life.pc(r(2),:);
         gk_life.pc(r(2),:) = temp;
        %%  贴头序列组间互换
         r = randperm(length(gk_life.gc(:,1)),2); %随机选两组互换
         temp = gk_life.gc(r(1),:);
         gk_life.gc(r(1),:) = gk_life.gc(r(2),:);
         gk_life.gc(r(2),:) = temp;
     end
     %% 喂料器互换（不受随机选择概率影响也不必区分组内、组间）
     for i = 1:FeCrossNum
         r = randperm(length(gk_life.fc),2);
         temp = gk_life.fc(r(1));
         gk_life.fc(r(1)) = gk_life.fc(r(2));
         gk_life.fc(r(2)) = temp;
     end

    [parent_life.fitness,parent_life.dis_sum] = Count_Fit(Smt,parent_life);
    [gk_life.fitness,gk_life.dis_sum] = Count_Fit(Smt,gk_life);

     if gk_life.fitness > parent_life.fitness
        life = gk_life;
     else
         life = parent_life;
     end
     
     
end
            
         
     
    